<?php

namespace App\Traits;

trait SignHelper
{
    /**
     * 获取数据签名
     *
     * @param  array $param 签名数组
     * @return string        签名字符串
     */
    public function getSign($param,$flag = 1)
    {
        if($flag == 2){
            $key = env("APP_SAS_KEY","zz-saas-api");
        }else{
            $key = config('common-api.sms.api_key');  
        }
        
        //去除数组中的空值和签名参数(sign)
        $param = $this->paramFilter($param);
        //按键名升序排列数组
        $param = $this->paramSort($param);

        $param_str = json_encode($param, JSON_UNESCAPED_UNICODE);
        //把拼接后的字符串再与安全校验码直接连接起来
        $param_str = $param_str . $key;
        //创建签名字符串
        return md5($param_str);
    }

    /**
     * 校验数据签名
     *
     * @param  string $sign 接口收到的签名
     * @param  array $param 签名数组
     * @return boolean true正确，false失败
     */
    public function checkSign($sign, $param)
    {
        return $sign == $this->getSign($param);
    }

    /**
     * 去除数组中的空值和签名参数
     *
     * @param  array $param 签名数组
     * @return array        去掉空值与签名参数后的新数组
     */
    private function paramFilter($param)
    {
        $param_filter = array();
        foreach ($param as $key => $val) {
            if ($key == 'sign' || empty($val)) {
                continue;
            }
            $param_filter[$key] = $val;
        }
        return $param_filter;
    }

    /**
     * 按键名升序排列数组
     *
     * @param  array $param 排序前的数组
     * @return array        排序后的数组
     */
    private function paramSort($param)
    {
        ksort($param);
        reset($param);
        return $param;
    }
}
